package com.shihb.structuralpatterns;

import com.shihb.utils.MyService;
import com.shihb.utils.ProxyInvocationHandle;

/**
 *Description:代理模式
 * 静态代理
 * 动态代理：动态代理类是动态生成的，不是直接写好的
 * 动态代理分为两大类：基于接口-JDK动态代理(我们这里使用)，基于类-cglib
 * 需要了解两个类Proxy,InvocationHandle
 *Version:1.0.0
 *@author shihb
 *@date 2020/4/21 11:21
 */
public class ProxyPattern {

  public static void main(String[] args) {
    // demo1
//    Host host = new Host();
//    Proxy proxy = new Proxy(host);
//    proxy.rent();
    // demo2 代理可以不改变原有业务新增一些东西
    ServiceImpl service = new ServiceImpl();
    service.add();
    // 假设现在有个新的需求要在每个业务增加一个日志输出就可以用代理实现
    // 这样不会影响原来得程序
    ServiceProxy serviceProxy = new ServiceProxy();
    serviceProxy.setService(service);
    serviceProxy.add();
    // 动态代理
    ProxyInvocationHandle pih = new ProxyInvocationHandle()
        .setTarget(service);
    MyService proxy = (MyService)pih.getProxy();

    proxy.delete();
  }

}
interface Rent{
  void rent();
}

/**
 * 真实得角色 房东
 */
class  Host implements Rent{

  @Override
  public void rent() {
    System.out.println("房东出租房子");
  }
}
/**
 * 代理得角色 中介
 */
class Proxy implements Rent{
  private Host host;

  public Proxy(Host host) {
    this.host = host;
  }

  @Override
  public void rent() {
    // 代理有附加得操作,但真实角色得操作很纯粹，其他得事代理完成
    seeHouse();
    host.rent();
    signAContract();
  }
  public void seeHouse(){
    System.out.println("中介带你看房");
  }
  public void signAContract(){
    System.out.println("中介和你签合同");
  }
}


class ServiceImpl implements MyService {

  @Override
  public void add() {
    System.out.println("实现新增业务的功能");
  }

  @Override
  public void delete() {
    System.out.println("实现删除业务的功能");
  }

  @Override
  public void update() {
    System.out.println("实现修改业务的功能");
  }

  @Override
  public void query() {
    System.out.println("实现查询业务的功能");
  }
}

class ServiceProxy implements MyService{
  private MyService service;

  public void setService(MyService service) {
    this.service = service;
  }

  @Override
  public void add() {
    log("add");
    this.service.add();
  }

  @Override
  public void delete() {
    log("delete");
    this.service.delete();
  }

  @Override
  public void update() {

    log("update");
    this.service.update();
  }

  @Override
  public void query() {
    log("query");
    this.service.query();
  }
  public void log(String msg){
    System.out.println("[debug]这在运行"+msg);
  }

}
